<?php

/**
 *-------------------------------------------------------------------------------
 * YuPHP 1.0 汉字转拼音类文件
 *-------------------------------------------------------------------------------
 * 版权所有: CopyRight By Mister Yu
 * 您可以自由使用该源码，但是在使用过程中，请保留作者信息。尊重他人劳动成果就是尊重自己
 *-------------------------------------------------------------------------------
 * Url: http://www.yuphp.org
 * Author: Internet （Mister Yu , YYT小改了下）
 * Time: 2011-12-31
 *-------------------------------------------------------------------------------
 */

class Pinyin {

	private $lib;//汉字 ASCII 码库

	/**
	 * 将汉字转化为拼音
	 *
	 * @access public
	 * @param string $str		所要转化拼音的汉字
	 * @param string $space		每个拼音及空格的分隔符
	 * @param boolean $utf8 	汉字编码是否为utf8
	 * @return string
	 */
	public function output($str, $space = '', $utf8 = true) {
		if (!is_string($str)) return false;

		$str = ($utf8 == true) ? $this->iconvStr('utf-8', 'gbk', $str) : $str;//编码转换
		$len = strlen($str);
		$pinyin = '';
		for ($i = 0; $i < $len; $i++) {
			$temp = ord(substr($str, $i, 1));
			if ($temp > 160) {
				$temp2 = ord(substr($str, ++$i, 1));
				$temp = $temp * 256 + $temp2 - 65536;
			}
			$pinyin .= $this->num2str($temp, $space);
		}
		if (!empty($space)) $pinyin = rtrim(str_replace(' ', $space, $pinyin), $space);

		return ($utf8 == true) ? $this->iconvStr('gbk', 'utf-8', $pinyin) : $pinyin;
	}

	/**
	 * 将汉字 ASCII 编码转化为拼音
	 *
	 * @access private
	 * @param int $num	汉字的 ASCII 值
	 * @param string $space	 每个拼音的分隔符
	 * @return string
	 */
	private function num2str($num, $space = '') {
		if (!$this->lib) $this->parseLib();

		if ($num > 0 && $num < 160) {
			return chr($num);
		} elseif ($num < -20319 || $num > -10247) {
			return '';
		} else {
			$total = count($this->lib) - 1;
			for($i = $total; $i >= 0; $i--) {
				if($this->lib[$i][1] <= $num) break;
			}
			return $this->lib[$i][0].$space;
		}
	}

	/**
	 * 汉字编码库
	 *
	 * @access private
	 */
	private function parseLib() {
		$this->lib = array(
			array('a', -20319),
			array('ai', -20317),
			array('an', -20304),
			array('ang', -20295),
			array('ao', -20292),
			array('ba', -20283),
			array('bai', -20265),
			array('ban', -20257),
			array('bang', -20242),
			array('bao', -20230),
			array('bei', -20051),
			array('ben', -20036),
			array('beng', -20032),
			array('bi', -20026),
			array('bian', -20002),
			array('biao', -19990),
			array('bie', -19986),
			array('bin', -19982),
			array('bing', -19976),
			array('bo', -19805),
			array('bu', -19784),
			array('ca', -19775),
			array('cai', -19774),
			array('can', -19763),
			array('cang', -19756),
			array('cao', -19751),
			array('ce', -19746),
			array('ceng', -19741),
			array('cha', -19739),
			array('chai', -19728),
			array('chan', -19725),
			array('chang', -19715),
			array('chao', -19540),
			array('che', -19531),
			array('chen', -19525),
			array('cheng', -19515),
			array('chi', -19500),
			array('chong', -19484),
			array('chou', -19479),
			array('chu', -19467),
			array('chuai', -19289),
			array('chuan', -19288),
			array('chuang', -19281),
			array('chui', -19275),
			array('chun', -19270),
			array('chuo', -19263),
			array('ci', -19261),
			array('cong', -19249),
			array('cou', -19243),
			array('cu', -19242),
			array('cuan', -19238),
			array('cui', -19235),
			array('cun', -19227),
			array('cuo', -19224),
            array('da', -19218),
            array('dai', -19212),
            array('dan', -19038),
            array('dang', -19023),
            array('dao', -19018),
            array('de', -19006),
            array('deng', -19003),
            array('di', -18996),
            array('dian', -18977),
            array('diao', -18961),
            array('die', -18952),
            array('ding', -18783),
            array('diu', -18774),
            array('dong', -18773),
            array('dou', -18763),
            array('du', -18756),
            array('duan', -18741),
            array('dui', -18735),
            array('dun', -18731),
            array('duo', -18722),
            array('e', -18710),
            array('en', -18697),
            array('er', -18696),
            array('fa', -18526),
            array('fan', -18518),
            array('fang', -18501),
            array('fei', -18490),
            array('fen', -18478),
            array('feng', -18463),
            array('fo', -18448),
            array('fou', -18447),
            array('fu', -18446),
            array('ga', -18239),
            array('gai', -18237),
            array('gan', -18231),
            array('gang', -18220),
            array('gao', -18211),
            array('ge', -18201),
            array('gei', -18184),
            array('gen', -18183),
            array('geng', -18181),
            array('gong', -18012),
            array('gou', -17997),
            array('gu', -17988),
            array('gua', -17970),
            array('guai', -17964),
            array('guan', -17961),
            array('guang', -17950),
            array('gui', -17947),
            array('gun', -17931),
            array('guo', -17928),
            array('ha', -17922),
            array('hai', -17759),
            array('han', -17752),
            array('hang', -17733),
            array('hao', -17730),
            array('he', -17721),
            array('hei', -17703),
            array('hen', -17701),
            array('heng', -17697),
            array('hong', -17692),
            array('hou', -17683),
            array('hu', -17676),
            array('hua', -17496),
            array('huai', -17487),
            array('huan', -17482),
            array('huang', -17468),
            array('hui', -17454),
            array('hun', -17433),
            array('huo', -17427),
            array('ji', -17417),
            array('jia', -17202),
            array('jian', -17185),
            array('jiang', -16983),
            array('jiao', -16970),
            array('jie', -16942),
            array('jin', -16915),
            array('jing', -16733),
            array('jiong', -16708),
            array('jiu', -16706),
            array('ju', -16689),
            array('juan', -16664),
            array('jue', -16657),
            array('jun', -16647),
            array('ka', -16474),
            array('kai', -16470),
            array('kan', -16465),
            array('kang', -16459),
            array('kao', -16452),
            array('ke', -16448),
            array('ken', -16433),
            array('keng', -16429),
            array('kong', -16427),
            array('kou', -16423),
            array('ku', -16419),
            array('kua', -16412),
            array('kuai', -16407),
            array('kuan', -16403),
            array('kuang', -16401),
            array('kui', -16393),
            array('kun', -16220),
            array('kuo', -16216),
            array('la', -16212),
            array('lai', -16205),
            array('lan', -16202),
            array('lang', -16187),
            array('lao', -16180),
            array('le', -16171),
            array('lei', -16169),
            array('leng', -16158),
            array('li', -16155),
            array('lia', -15959),
            array('lian', -15958),
            array('liang', -15944),
            array('liao', -15933),
            array('lie', -15920),
            array('lin', -15915),
            array('ling', -15903),
            array('liu', -15889),
            array('long', -15878),
            array('lou', -15707),
            array('lu', -15701),
            array('lv', -15681),
            array('luan', -15667),
            array('lue', -15661),
            array('lun', -15659),
            array('luo', -15652),
            array('ma', -15640),
            array('mai', -15631),
            array('man', -15625),
            array('mang', -15454),
            array('mao', -15448),
            array('me', -15436),
            array('mei', -15435),
            array('men', -15419),
            array('meng', -15416),
            array('mi', -15408),
            array('mian', -15394),
            array('miao', -15385),
            array('mie', -15377),
            array('min', -15375),
            array('ming', -15369),
            array('miu', -15363),
            array('mo', -15362),
            array('mou', -15183),
            array('mu', -15180),
            array('na', -15165),
            array('nai', -15158),
            array('nan', -15153),
            array('nang', -15150),
            array('nao', -15149),
            array('ne', -15144),
            array('nei', -15143),
            array('nen', -15141),
            array('neng', -15140),
            array('ni', -15139),
            array('nian', -15128),
            array('niang', -15121),
            array('niao', -15119),
            array('nie', -15117),
            array('nin', -15110),
            array('ning', -15109),
            array('niu', -14941),
            array('nong', -14937),
            array('nu', -14933),
            array('nv', -14930),
            array('nuan', -14929),
            array('nue', -14928),
            array('nuo', -14926),
            array('o', -14922),
            array('ou', -14921),
            array('pa', -14914),
            array('pai', -14908),
            array('pan', -14902),
            array('pang', -14894),
            array('pao', -14889),
            array('pei', -14882),
            array('pen', -14873),
            array('peng', -14871),
            array('pi', -14857),
            array('pian', -14678),
            array('piao', -14674),
            array('pie', -14670),
            array('pin', -14668),
            array('ping', -14663),
            array('po', -14654),
            array('pu', -14645),
            array('qi', -14630),
            array('qia', -14594),
            array('qian', -14429),
            array('qiang', -14407),
            array('qiao', -14399),
            array('qie', -14384),
            array('qin', -14379),
            array('qing', -14368),
            array('qiong', -14355),
            array('qiu', -14353),
            array('qu', -14345),
            array('quan', -14170),
            array('que', -14159),
            array('qun', -14151),
            array('ran', -14149),
            array('rang', -14145),
            array('rao', -14140),
            array('re', -14137),
            array('ren', -14135),
            array('reng', -14125),
            array('ri', -14123),
            array('rong', -14122),
            array('rou', -14112),
            array('ru', -14109),
            array('ruan', -14099),
            array('rui', -14097),
            array('run', -14094),
            array('ruo', -14092),
            array('sa', -14090),
            array('sai', -14087),
            array('san', -14083),
            array('sang', -13917),
            array('sao', -13914),
            array('se', -13910),
            array('sen', -13907),
            array('seng', -13906),
            array('sha', -13905),
            array('shai', -13896),
            array('shan', -13894),
            array('shang', -13878),
            array('shao', -13870),
            array('she', -13859),
            array('shen', -13847),
            array('sheng', -13831),
            array('shi', -13658),
            array('shou', -13611),
            array('shu', -13601),
            array('shua', -13406),
            array('shuai', -13404),
            array('shuan', -13400),
            array('shuang', -13398),
            array('shui', -13395),
            array('shun', -13391),
            array('shuo', -13387),
            array('si', -13383),
            array('song', -13367),
            array('sou', -13359),
            array('su', -13356),
            array('suan', -13343),
            array('sui', -13340),
            array('sun', -13329),
            array('suo', -13326),
            array('ta', -13318),
            array('tai', -13147),
            array('tan', -13138),
            array('tang', -13120),
            array('tao', -13107),
            array('te', -13096),
            array('teng', -13095),
            array('ti', -13091),
            array('tian', -13076),
            array('tiao', -13068),
            array('tie', -13063),
            array('ting', -13060),
            array('tong', -12888),
            array('tou', -12875),
            array('tu', -12871),
            array('tuan', -12860),
            array('tui', -12858),
            array('tun', -12852),
            array('tuo', -12849),
            array('wa', -12838),
            array('wai', -12831),
            array('wan', -12829),
            array('wang', -12812),
            array('wei', -12802),
            array('wen', -12607),
            array('weng', -12597),
            array('wo', -12594),
            array('wu', -12585),
            array('xi', -12556),
            array('xia', -12359),
            array('xian', -12346),
            array('xiang', -12320),
            array('xiao', -12300),
            array('xie', -12120),
            array('xin', -12099),
            array('xing', -12089),
            array('xiong', -12074),
            array('xiu', -12067),
            array('xu', -12058),
            array('xuan', -12039),
            array('xue', -11867),
            array('xun', -11861),
            array('ya', -11847),
            array('yan', -11831),
            array('yang', -11798),
            array('yao', -11781),
            array('ye', -11604),
            array('yi', -11589),
            array('yin', -11536),
			array('ying', -11358),
            array('yo', -11340),
            array('yo', -11340),
            array('yong', -11339),
            array('you', -11324),
            array('yu', -11303),
            array('yuan', -11097),
            array('yue', -11077),
            array('yun', -11067),
            array('za', -11055),
            array('zai', -11052),
            array('zan', -11045),
            array('zang', -11041),
            array('zao', -11038),
            array('ze', -11024),
            array('zei', -11020),
            array('zen', -11019),
            array('zeng', -11018),
            array('zha', -11014),
            array('zhai', -10838),
            array('zhan', -10832),
            array('zhang', -10815),
            array('zhao', -10800),
            array('zhe', -10790),
            array('zhen', -10780),
            array('zheng', -10764),
            array('zhi', -10587),
            array('zhong', -10544),
            array('zhou', -10533),
            array('zhu', -10519),
            array('zhua', -10331),
            array('zhuai', -10329),
            array('zhuan', -10328),
            array('zhuang', -10322),
            array('zhui', -10315),
            array('zhun', -10309),
            array('zhuo', -10307),
            array('zi', -10296),
            array('zong', -10281),
            array('zou', -10274),
            array('zu', -10270),
            array('zuan', -10262),
			array('zui', -10260),
			array('zun', -10256),
			array('zuo', -10254),
		);
	}

	/**
	 * 转换编码
	 *
	 * @access public
	 * @param string $from	字符串原来编码
	 * @param string $to 	将要转换成哪种编码
	 * @param string $str	将要转换的字符串
	 */
	public function iconvStr($from, $to, $str) {
		if(!is_string($str)) return;

		if(function_exists('mb_convert_encoding')) {
			return mb_convert_encoding ($str, $to, $from);
		} elseif(function_exists('iconv')) {
			return iconv($from, $to, $str);
		} else {
			return $str;
		}
	}

	/**
	 * 析构函数，释放资源
	 *
	 * @access public
	 */
	public function __destruct() {
		if (isset($this->lib)) unset($this->lib);
	}

}